



#include	"main.h"



inline bool LPI2C_HAL_MasterGetStatus(LPI2C_Type * base, lpi2c_master_status_t statusFlag)
{
    return (bool)((LPI2C_RD_MSR(base) >> statusFlag) & 0x1U);
}

inline void LPI2C_HAL_MasterClearStatus(LPI2C_Type * base, lpi2c_master_status_t statusFlag)
{
    /* Flags could be cleared by write 1 except TDF/RDF/MBF/BBF. Write 0 will
     * have no effect. */
    LPI2C_WR_MSR(base, 0x1U << statusFlag);
}




/********************************************************
**函数名：	BSW_LPI2C_INIT
**功能：		初始化 LPI2C_INIT
**输入参数	Lp2c_Cfg	IIC配置结构体
**返回值：	无
**注意：		根据相应的电路配置IIC
*********************************************************/
void BSW_LPI2C_INIT(BSW_LPI2C_Cfg Lpi2c_Cfg)
{
	PCC_SetClockMode(PCC,Lpi2c_Cfg.ClockName, false);
	PCC_SetPeripheralClockControl(PCC, Lpi2c_Cfg.ClockName,true, Lpi2c_Cfg.u32_ClkSoc, 0,0);
	PCC_SetClockMode(PCC,Lpi2c_Cfg.ClockName, true);

	LPI2C_Init(Lpi2c_Cfg.Lpi2c_Base);
	LPI2C_Set_MasterEnable(Lpi2c_Cfg.Lpi2c_Base, false);
	
	LPI2C_Reset_MasterRxFIFOCmd(Lpi2c_Cfg.Lpi2c_Base);								                  		/* 清空RXFIFO                                                      */
	LPI2C_Reset_MasterTxFIFOCmd(Lpi2c_Cfg.Lpi2c_Base);								              				/* 清空TXFIFO                                                      */
	LPI2C_Set_MasterDebugMode(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.b_MDebug);						       		/* 设置主机DEBUG模式                                               */
	LPI2C_Set_MasterSetMode(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.b_MSet);							        		/* 设置主机打盹模式                                                */
	LPI2C_Set_MasterSoftwareReset(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.b_MSofRest);				       	/* 主机模式软件复位                                                */
	
	LPI2C_Set_SlaveAddrConfig(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.Lpi2c_SlvCon);			           	/* 匹配接收地址                                                    */
//	LPI2C_Set_MasterMatchConfig(Lpi2c_Cfg.Lpi2c_Base,LPI2C_MATCH_DISABLED);						   	/* 配置主机匹配模式                                                */
//	LPI2C_Set_MasterMatch0(Lpi2c_Cfg.Lpi2c_Base,0);	
//	LPI2C_Set_MasterMatch1(Lpi2c_Cfg.Lpi2c_Base,0);	
	
	LPI2C_Set_MasterPrescaler(Lpi2c_Cfg.Lpi2c_Base, Lpi2c_Cfg.Set_Mpres);				             /* 设置IIC预分频系数                                               */
	LPI2C_Set_MasterPinConfig(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.Set_MPinCfg);				           /* 配置引脚模式 -开漏输出                                          */
	LPI2C_Set_MasterNACKConfig(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.Set_MNACKCfg);								 /* 配置应答位                                                      */
	
	LPI2C_Set_MasterRxDMA(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.b_MRxDMA);													 /* 配置RXDMA                                                       */
	LPI2C_Set_MasterTxDMA(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.b_MTxDMA);													 /* 配置TXDMA                                                       */	

	/*设置主机的操作模式*/
//	LPI2C_Set_MasterHreqSelect(Lpi2c_Cfg.Lpi2c_Base,LPI2C_HREQ_EXTERNAL_PIN);
	LPI2C_Set_MasterCircularFIFO(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.b_MCirFIFO);								 /* 配置循环存储设置                                                */
	LPI2C_Set_MasterRxDataMatch(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.Set_MRxDataMatch);			       /* 配置主机接收存储                                                */
	LPI2C_Set_MasterTimeoutConfig(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.Set_MTimeoutCfg);				   /* 配置通信超时标志                                                */
	LPI2C_Set_MasterAutoStopConfig(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.b_MAutoStopCfg);					 /* 配置自动停止                                                    */
	
	LPI2C_Set_MasterSDAGlitchFilter(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u8_MSDAG);								 /* 设置SDA数字滤波器                                               */
	LPI2C_Set_MasterSCLGlitchFilter(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u8_MSCLG);								 /* 设置SCL数字滤波器                                               */
	

	/*此功能在时钟周期中配置总线空闲超时周期。 如果SCL和SDA都高于配置的周期超时，则假定I2C总线空闲，主机可以产生START条件。 设置为零时，将禁用此功能。*/
	LPI2C_Set_MasterBusIdleTimeout(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u16_MBusIdle);						 /* 设置BUS总线空闲超时标志                                         */
	LPI2C_Set_MasterPinLowTimeout(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u32_MPinLow);							 /* 设置总线低电平超时标志                                          */
	
	/**此功能设置用作SDA数据保持时间的最小周期数（减1）。 必须配置小于最小SCL低周期。*/
	LPI2C_Set_MasterDataValidDelay(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u8_MDataValid);
	/*此功能将主机使用的最小循环次数（减1）配置为（重复）START条件的设置和保持时间以及STOP条件的设置时间。 
	建立时间延长了检测外部SCL引脚上升沿所需的时间。由于外部负载而忽略任何额外的电路板延迟，这等于（2 + FILTSCL）/ 2 ^ PRESCALE周期。*/
	LPI2C_Set_MasterSetupHoldDelay(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u8_MSetupHold);
	LPI2C_Set_MasterClockHighPeriod(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u8_MClockHigh);
	LPI2C_Set_MasterClockLowPeriod(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u8_MClockLow);
	
	LPI2C_Set_MasterRxFIFOWatermark(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u16_MRxFIFO);	
	LPI2C_Set_MasterTxFIFOWatermark(Lpi2c_Cfg.Lpi2c_Base,Lpi2c_Cfg.u16_MTxFIFO);	
	
	
	INT_SYS_EnableIRQ(LPI2C0_Master_IRQn);
	LPI2C_Set_MasterEnable(Lpi2c_Cfg.Lpi2c_Base,true);													            	/* 主机模式使能                                                    */
	
}

/*******************************************************
 * 函数名：BSW_LPI2C_ByteWrite
 * 描述  ：写一个字节到I2C设备寄存器中
 * 输入  ：IIC_Addr 8bit从机地址 
 * 输入  ：REG_Address 接收数据的IIC设备寄存器的地址 
 * 输入  ：REG_data 待写入的数据
 * 输出  : 无
 * 调用  ：外部调用	 
********************************************************/
void BSW_LPI2C_ByteWrite(uint8_t IIC_Addr,uint8_t REG_Address,uint8_t REG_data)
{
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_START,IIC_Addr);
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_TRANSMIT,REG_Address);
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_TRANSMIT,REG_data);
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_STOP,0x00);
}


/*******************************************************
 * 函数名：BSW_LPI2C_ByteRead
 * 描述  ：从IIC设备寄存器中读取一个长度为uint8_t_Rx_Lenth的数组
 * 输入  ：IIC_Addr 8bit从机地址 
 * 输入  ：REG_Address 接收数据的IIC设备寄存器的地址 
 * 输入  ：长度为uint8_t_Rx_Lenth组uint8_t_Reve_Buff
 * 输出  : 无
 * 调用  ：外部调用	 
********************************************************/
uint16_t BSW_LPI2C_ByteRead(uint8_t IIC_Addr,uint8_t REG_Address)
{
	uint16_t u16_Data_H,u16_Data_L = 0;
	
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_START,IIC_Addr);
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_TRANSMIT,REG_Address);
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_START,IIC_Addr|0x01);
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_RECEIVE,0x01);
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_RECEIVE,0x00);
	LPI2C_Cmd_MasterTransmit(LPI2C0,LPI2C_MASTER_COMMAND_STOP,0x00);
	u16_Data_H = LPI2C_Get_MasterRxData(LPI2C0);
	u16_Data_L = LPI2C_Get_MasterRxData(LPI2C0);
	return (u16_Data_H<<8)+ u16_Data_L;
}



/********************************************************
**函数名：	
**功能：	  
**输入参数：
**返回值：	
**注意：		
*********************************************************/
void LPI2C0_Master_IRQHandler(void)
{
	LPI2C0_IRQ();
}



//	LPI2C_Get_MasterBusBusyEvent(LPI2C0);												                   /* 返回总线状态                                                    */
//	LPI2C_Get_MasterBusyStateEvent(LPI2C0);											                   /* 返回IIC主机状态                                                 */
//	LPI2C_Get_MasterReceiveDataReadyEvent(LPI2C0);							                   /* 返回接收FIFO状态-如果FIFO的大于 RXFIFO-watermark设置为 true     */
//	LPI2C_Get_MasterTransmitDataRequestEvent(LPI2C0);						                   /* 返回发送FIFO状态-如果FIFO的小于等于 TXFIFO-watermark设置为 true */
//	LPI2C_Get_MasterDataMatchEvent(LPI2C0);											                   /* 返回数据匹配状态                                                */
//	LPI2C_Get_MasterPinLowTimeoutEvent(LPI2C0);									                   /* 返回低电平超时状态 - 是否超时                                   */
//	LPI2C_Get_MasterFIFOErrorEvent(LPI2C0);											                   /* 没有设置START状态 就发送或接收数据 返回TRUE                     */
//	LPI2C_Get_MasterRxFIFOSize(LPI2C0);													                   /* 获取主机RXFIFO大小                                              */
//	LPI2C_Get_MasterTxFIFOSize(LPI2C0);													                   /* 获取主机TXFIFO大小                                              */
//	LPI2C_Get_MasterHreqPolarity(LPI2C0);
//	LPI2C_Get_MasterHreqEnable(LPI2C0);






